package priv.sympsel.multiThreadDemo;

/**
 * 使用volatile修饰实例变量，禁止指令重排序，确保对象在完全初始化之后才被其它线程访问
 * 使用@SuppressWarnings("InstantiationOfUtilityClass")注解来忽略警告
 * 使用双重if判断，既实现了单列模式，又避免了频繁加锁导致的性能问题
 */
@SuppressWarnings("InstantiationOfUtilityClass")
public class Demo2 {
    private static volatile Demo2 demo2 = null;

    public static Demo2 getInstance() {
        if (demo2 == null) {
            // synchronized用于保持内部操作的完整性
            synchronized (Demo2.class) {
                if (demo2 == null) {
                    demo2 = new Demo2();
                }
            }
        }
        return demo2;
    }

    private Demo2() {}
    public static void main(String[] args) {
        Demo2 instance1 = Demo2.getInstance();
        Demo2 instance2 = Demo2.getInstance();
        System.out.println(instance1 == instance2);
    }
}
